package qqserver.service;

import qqcommon.Message;
import qqcommon.MessageType;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Collection;
import java.util.Iterator;

//服务端线程
public class ServerConnectThread extends Thread {
    //    持有服务端socket对象
    private Socket socket;

    //    线程的构造器
    public ServerConnectThread(Socket socket) {
        this.socket = socket;
    }

    /**
     * 获取服务端对应的socket
     *
     * @return
     */
    public Socket getSocket() {
        return socket;
    }


    //    服务端的业务逻辑
    @Override
    public void run() {
        boolean loop = true;
        while (loop) {
            try {
//                获取客户端发来的数据
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();
//                根据消息种类跳转
                Message message1 = new Message();//服务端要发送回客户端的message
                ObjectOutputStream oos;
                switch (message.getMesType()) {
                    case MessageType.MESSAGE_GET_ONLINE_FRIEND://客户端要在线用户列表
                        System.out.println("用户 " + message.getSender() + " 要在线用户列表");
                        message1.setMesType(MessageType.MESSAGE_RET_ONLINE_FRIEND);//设置信息类型
                        message1.setContent(QQServer.getOnlineUser());//设置信息内容为在线用户列表
                        oos = new ObjectOutputStream(socket.getOutputStream());//向当前线程对应客户端回送消息
                        oos.writeObject(message1);//向客户端传输数据
                        break;
                    case MessageType.MESSAGE_TO_ONE_MES://私聊信息
                        System.out.println("用户 " + message.getSender() + " 向用户" + message.getReceiver() + "私聊了消息：" + message.getContent());
                        message1.setMesType(MessageType.MESSAGE_TO_ONE_MES);//设置信息类型
                        message1.setContent(message.getContent());//设置信息内容为要转发的消息内容
                        message1.setSender(message.getSender());//设置私聊信息发送者
                        message1.setReceiver(message.getReceiver());//设置私聊信息接收者（可省略）
//                        找到接收者对应线程中的socket，创建输出流发送(可能对应用户不存在，可以空处理)
                        ServerConnectThread receiverThread1 = ManageServerConnectThread.getServerConnectThread(message.getReceiver());
                        if (receiverThread1 == null) {
                            System.out.println("用户" + message.getReceiver() + " 不存在，私聊失败");
                        } else {
                            oos = new ObjectOutputStream(receiverThread1.getSocket().getOutputStream());
                            oos.writeObject(message1);//向客户端传输数据
                        }
                        break;
                    case MessageType.MESSAGE_TO_ALL_MES://群聊消息
                        System.out.println("用户 " + message.getSender() + " 其他用户群发了消息：" + message.getContent());
                        message1.setMesType(MessageType.MESSAGE_TO_ALL_MES);//设置群里消息的类型
                        message1.setSender(message.getSender());//设置群里消息的发送者
                        message1.setContent(message.getContent());//设置群里消息的内容
                        Collection<ServerConnectThread> threads = ManageServerConnectThread.getHsm().values();//获取在线用户的所有线程
                        ServerConnectThread senderThread = ManageServerConnectThread.getServerConnectThread(message.getSender());//发送者的线程
                        Iterator<ServerConnectThread> it = threads.iterator();//在线用户线程集合
                        ServerConnectThread receiverThread = null;//接收者的线程
                        while (it.hasNext()) {//遍历线程集合
                            receiverThread = it.next();
                            if (receiverThread != senderThread) {//除去当前用户对应线程，其他线程群发消息
                                oos = new ObjectOutputStream(receiverThread.getSocket().getOutputStream());
                                oos.writeObject(message1);
                            }
                        }
                        break;
                    case MessageType.MESSAGE_FILE_TO_ONE_MES://文件消息
                        System.out.println("用户" + message.getSender() + " 向 用户" + message.getReceiver() + "发送了文件" + message.getFileName() + ",文件大小为：" + message.getFileSize() + "KB");
                        message1.setMesType(MessageType.MESSAGE_FILE_TO_ONE_MES);//设置消息类型为文件
                        message1.setFileContent(message.getFileContent());//设置文件字节内容
                        message1.setFileSrc(message.getFileSrc());//设置文件源路径
                        message1.setFileDes(message.getFileDes());//设置文件目标路径
                        message1.setFileSize(message.getFileSize());//设置文件大小
                        message1.setSender(message.getSender());//设置发送者
                        message1.setReceiver(message.getReceiver());//设置接收者
                        message1.setFileName(message.getFileName());//设置文件名
                        //                        找到接收者对应线程中的socket，创建输出流发送(可能对应用户不存在，可以空处理)
                        ServerConnectThread receiverThread2 = ManageServerConnectThread.getServerConnectThread(message.getReceiver());
                        if (receiverThread2 == null) {
                            System.out.println("用户" + message.getReceiver() + " 不存在，文件发送失败");
                        } else {
                            oos = new ObjectOutputStream(receiverThread2.getSocket().getOutputStream());
                            oos.writeObject(message1);//向客户端传输数据
                        }
                        break;
                    case MessageType.MESSAGE_CLIENT_EXIT://客户端要退出
                        System.out.println(message.getSender() + "在服务端退出");
                        ManageServerConnectThread.removeUserThread(message.getSender());//移除线程
                        socket.close();
                        loop = false;//退出当前线程
                        break;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
